package controle;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Iterator;
import java.util.Map;

import javax.swing.JFrame;

import modelo.Eleitor;
import modelo.Partido;
import vista.JanelaMsg;
import vista.PainelApurador;
import vista.PainelPrincipal;
import vista.VistaLogin;

public class EncerraCliente implements Runnable {

	boolean fimVotacao;
	AtualizaCliente conector;
	int votosNulosVereador = 0;
	int votosNulosPrefeito = 0;
	int secao;
	PainelApurador apurador;
	Map<String, Partido> partidos;
	PainelPrincipal painel;
	VistaLogin painelLogin;
	JFrame janela;

	public EncerraCliente(AtualizaCliente conector, int secao, Map<String, Partido> partidos,
			PainelPrincipal painel, JFrame janela, VistaLogin painelLogin) {
		fimVotacao = false;
		this.conector = conector;
		this.secao = secao;
		this.partidos = partidos;
		this.painel = painel;
		this.janela = janela;
		this.painelLogin = painelLogin;
	}

	@Override
	public void run() {
		DataInputStream leitor;
		Socket porta;

		while (conector.isModoVotacao() == false) {
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		try {
			while (isFimVotacao() == false) {
				porta = new Socket("127.0.0.1", 7006);
				leitor = new DataInputStream(porta.getInputStream());
				setFimVotacao(leitor.readBoolean());
				leitor.close();
				porta.close();
				porta = null;
				Thread.sleep(1000);
			}
		} catch (IOException e) {
			new JanelaMsg("Error!", "Servidor Inativo!");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		new JanelaMsg("Fim!", "Acabou a eleicao, se estiver "
				+ "votando, termine seu voto");
		
		conector.setModoVotacao(false);
		
		if (painelLogin.isVisible() == true){
			serializarVotos();
			janela.remove(painelLogin);
			janela.add(apurador);
			painelLogin.updateUI();
			apurador.updateUI();
			janela.setVisible(true);
		}
	}

	public int getVotosNulosVereador() {
		return votosNulosVereador;
	}

	public void setVotosNulosVereador(int votosNulosVereador) {
		this.votosNulosVereador = votosNulosVereador;
	}

	public int getVotosNulosPrefeito() {
		return votosNulosPrefeito;
	}

	public void setVotosNulosPrefeito(int votosNulosPrefeito) {
		this.votosNulosPrefeito = votosNulosPrefeito;
	}

	public void setFimVotacao(boolean fimVotacao) {
		this.fimVotacao = fimVotacao;
	}

	public boolean isFimVotacao() {
		return fimVotacao;
	}
	
	public void serializarVotos(){
		int qtEleitores = 0;
		int abstencoes = 0;
		Iterator<Eleitor> a = conector.getEleitores().values().iterator();
		File arquivo = new File("Secao " + secao);
		FileOutputStream escritor;
		ObjectOutputStream tradutor;
		
		while (a.hasNext() == true){
			if (a.next().getSecao() == secao){
				qtEleitores += 1;
			}
		}
		
		a = conector.getEleitores().values().iterator();
		
		while (a.hasNext() == true){
			if (a.next().getVotou() == false){
				abstencoes += 1;
			}
		}
		
		try {
			arquivo.delete();
			arquivo.createNewFile();
			escritor = new FileOutputStream(arquivo);
			tradutor = new ObjectOutputStream(escritor);
			escritor.write(secao);
			escritor.flush();
			escritor.write(qtEleitores);
			escritor.flush();
			escritor.write(votosNulosVereador);
			escritor.flush();
			escritor.write(votosNulosPrefeito);
			escritor.flush();
			tradutor.writeObject(conector.getVereadores());
			tradutor.flush();
			tradutor.writeObject(conector.getPrefeitos());
			tradutor.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		apurador = new PainelApurador(secao, votosNulosVereador, votosNulosPrefeito, 
				qtEleitores, abstencoes, conector.getVereadores(), conector.getPrefeitos(),
				partidos);
	}

	public PainelApurador getApurador() {
		return apurador;
	}
}
